const cryptoJS = require('crypto-js');


/**
 * 强智科技-初版加密算法（base64）
 * @param {string} message 待加密字符串
 */
const encodeInp = message => {
  const keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  let output = '';
  let chr1,
    chr2,
    chr3 = '';
  let enc1,
    enc2,
    enc3,
    enc4 = '';
  let i = 0;
  do {
    chr1 = message.charCodeAt(i++);
    chr2 = message.charCodeAt(i++);
    chr3 = message.charCodeAt(i++);
    enc1 = chr1 >> 2;
    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
    enc4 = chr3 & 63;
    if (isNaN(chr2)) {
      enc3 = enc4 = 64;
    } else if (isNaN(chr3)) {
      enc4 = 64;
    }
    output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
    chr1 = chr2 = chr3 = '';
    enc1 = enc2 = enc3 = enc4 = '';
  } while (i < message.length);
  return output;
};

/**
 * Base64 编码
 * @param {string} message 待加密字符串
 * @return {string} str
 */
const Base64 = message => {
  return Buffer.from(message, 'utf-8').toString('base64');
};


/**
 * 计算给定消息的MD5哈希值
 * @param {string} message 待加密字符串
 * @return  {string} str
 */
const MD5 = message => {
  return cryptoJS.MD5(message).toString();
};


/**
 * 计算给定消息的SHA-256哈希值
 * @param {string} message 待加密字符串
 * @return  {string} str
 */
const SHA256 = message => {
  return cryptoJS.SHA256(message).toString();
};

/**
 * 使用HMAC算法和SHA256哈希函数计算消息的哈希值
 * @param {string} message 待加密字符串
 * @return  {string} str
 */
const HmacSHA256 = message => {
  return cryptoJS.HmacSHA256(message).toString();
};

/**
 * 使用HMAC算法和SHA256哈希函数计算消息的哈希值
 * @param {string} message 待加密字符串
 * @param {string} key 密钥
 * @return  {string} str
 */
const AES = (message, key) => {
  return cryptoJS.AES.encrypt(message, key).toString();
};


module.exports = {
  encodeInp,
  Base64,
  MD5,
  SHA256,
  HmacSHA256,
  AES,
};
